package cn.xiaobai.captcha.utils.redis;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * @author yangdaji
 * @version 1.0
 * @Description: redis工具
 * @date 22-3-14 下午 10:37
 */
@Slf4j
public class RedisUtil {


    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * 普通加入缓存
     *
     * @param key   键
     * @param value 值
     */
    public boolean set(String key, Object value) {
        try {
            this.redisTemplate.opsForValue().set(key, this.objToJson(value));
            return true;
        } catch (Exception e) {
            log.error("redis error: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 普通加入缓存并设置有效期, 单位: 秒
     *
     * @param key     键
     * @param value   值
     * @param timeout 缓存有效时间(s),时间小于0,将设置为默认的
     */
    public boolean set(String key, Object value, long timeout) {

        try {
            if (timeout > 0) {
                redisTemplate.opsForValue().set(key, this.objToJson(value), timeout, TimeUnit.SECONDS);
            } else {
                this.set(key, value);
            }
            return true;
        } catch (Exception e) {
            log.error("redis error: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 普通加入缓存并设置有效期
     *
     * @param key     键
     * @param value   值
     * @param timeout 缓存有效时间(s),时间小于0,将设置为默认的
     * @param unit    单位
     * @return
     */
    public boolean set(String key, Object value, long timeout, TimeUnit unit) {

        try {
            if (timeout > 0) {
                redisTemplate.opsForValue().set(key, this.objToJson(value), timeout, unit);
            } else {
                this.set(key, value);
            }
            return true;
        } catch (Exception e) {
            log.error("redis error: {}", e.getMessage());
            return false;
        }
    }

    /**
     * 普通key获取缓存
     *
     * @param key 键
     * @return
     */
    public <T> T get(String key, Class<T> clazz) {

        return key == null ? null : this.jsonToObj(redisTemplate.opsForValue().get(key), clazz);
    }


    /**
     * 对象转换json格式
     *
     * @param object 对象数据
     * @return
     */
    private String objToJson(Object object) {
        //对象数据为null
        if (object == null) {
            return null;
        }
        //对象是String或者原来类型
        else if (object instanceof String || object.getClass().isPrimitive()) {
            return object.toString();
        } else {
            return JSONObject.toJSONString(object);
        }
    }


    /**
     * json格式转换对象
     *
     * @param value 值
     * @param clazz 类型
     * @param <T>
     * @return
     */
    private <T> T jsonToObj(String value, Class<T> clazz) {

        return clazz == String.class ? (T) value : JSONObject.parseObject(value, clazz);
    }
}
